#!/usr/bin/env python3
"""
任务 1: 创建 GitRepository 数据模型基础结构
文件: models/git_repository.py
实现 GitRepository 类的 __init__ 方法，接收 path 参数
添加 path, name, is_valid, last_updated, pull_status, error_message 属性
实现 validate_path() 方法验证路径有效性
实现 get_name() 方法从路径提取仓库名称
"""

import os
import pathlib
from datetime import datetime
from typing import Optional

class GitRepository:
    """Git 仓库数据模型"""
    
    def __init__(self, path: str):
        """
        初始化 Git 仓库对象
        
        Args:
            path: 仓库路径
        """
        self.path = path
        self.name = ""
        self.is_valid = False
        self.last_updated = ""
        self.pull_status = "pending"
        self.error_message = ""
        
        # 验证路径并初始化属性
        self.validate_path()
        if self.is_valid:
            self.get_name()
            self.last_updated = datetime.now().isoformat()
    
    def validate_path(self) -> bool:
        """
        验证路径有效性
        
        Returns:
            bool: 路径是否有效
        """
        try:
            # 使用 pathlib 处理路径
            repo_path = pathlib.Path(self.path)
            
            # 检查路径是否存在
            if not repo_path.exists():
                self.error_message = f"路径不存在: {self.path}"
                self.is_valid = False
                return False
            
            # 检查是否为目录
            if not repo_path.is_dir():
                self.error_message = f"路径不是目录: {self.path}"
                self.is_valid = False
                return False
            
            # 检查是否为 Git 仓库（包含 .git 目录）
            git_dir = repo_path / ".git"
            if not git_dir.exists():
                self.error_message = f"不是有效的 Git 仓库: {self.path}"
                self.is_valid = False
                return False
            
            # 使用 realpath 防止路径遍历攻击
            real_path = os.path.realpath(self.path)
            if not real_path.startswith(os.path.realpath(os.getcwd())):
                self.error_message = f"路径访问被拒绝: {self.path}"
                self.is_valid = False
                return False
            
            self.is_valid = True
            return True
            
        except Exception as e:
            self.error_message = f"路径验证失败: {str(e)}"
            self.is_valid = False
            return False
    
    def get_name(self) -> str:
        """
        从路径提取仓库名称
        
        Returns:
            str: 仓库名称
        """
        if not self.is_valid:
            return ""
        
        try:
            # 获取路径的最后部分作为仓库名称
            repo_path = pathlib.Path(self.path)
            self.name = repo_path.name
            return self.name
        except Exception as e:
            self.error_message = f"获取仓库名称失败: {str(e)}"
            return ""
    
    def update_status(self, status: str, error_msg: str = ""):
        """
        更新仓库状态
        
        Args:
            status: 状态 (success/failed/skipped)
            error_msg: 错误信息（如果有）
        """
        self.pull_status = status
        if error_msg:
            self.error_message = error_msg
        self.last_updated = datetime.now().isoformat()
    
    def __str__(self) -> str:
        """字符串表示"""
        return f"GitRepository(path='{self.path}', name='{self.name}', valid={self.is_valid}, status='{self.pull_status}')"

def test_git_repository():
    """测试 GitRepository 类"""
    print("测试 GitRepository 类...")
    
    # 测试有效路径
    test_repo = GitRepository("/tmp")
    print(f"测试仓库: {test_repo}")
    
    # 测试无效路径
    invalid_repo = GitRepository("/nonexistent/path")
    print(f"无效仓库: {invalid_repo}")
    
    # 测试当前目录
    current_repo = GitRepository(".")
    print(f"当前目录: {current_repo}")

if __name__ == "__main__":
    test_git_repository()